μ₯κ³ λͺ¨λΈ μμμ λν ν¬κ΄μ μΈ κ°μ΄λ. λ°μ΄ν°λ² μ΄μ€ μ€κ³λ₯Ό μν μ€μ©μ μΈ μμ μ κ³ λ € μ¬νμ ν¬ν¨νμ¬ μΆμ κΈ°λ³Έ ν΄λμ€μ λ€μ€ ν μ΄λΈ μμμ λ€λ£Ήλλ€.
μ₯κ³ λͺ¨λΈ μμ: μΆμ λͺ¨λΈ λ λ€μ€ ν μ΄λΈ μμ
μ₯κ³ μ κ°μ²΄-κ΄κ³ν λ§€νΌ(ORM)λ λ°μ΄ν° λͺ¨λΈλ§κ³Ό λ°μ΄ν°λ² μ΄μ€ μνΈμμ©μ μν κ°λ ₯ν κΈ°λ₯μ μ 곡ν©λλ€. μ₯κ³ μμ ν¨μ¨μ μΈ λ°μ΄ν°λ² μ΄μ€ μ€κ³μ ν΅μ¬ μΈ‘λ©΄ μ€ νλλ λͺ¨λΈ μμμ μ΄ν΄νκ³ νμ©νλ κ²μ λλ€. μ΄λ₯Ό ν΅ν΄ μ¬λ¬ λͺ¨λΈμ κ±Έμ³ κ³΅ν΅ νλμ λμμ μ¬μ¬μ©νμ¬ μ½λ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μμ±μ ν₯μμν¬ μ μμ΅λλ€. μ₯κ³ λ λ κ°μ§ μ£Όμ λͺ¨λΈ μμ μ νμ μ 곡ν©λλ€: μΆμ κΈ°λ³Έ ν΄λμ€(abstract base classes)μ λ€μ€ ν μ΄λΈ μμ(multi-table inheritance)μ λλ€. κ° μ κ·Ό λ°©μμ κ³ μ ν μ¬μ© μ¬λ‘μ λ°μ΄ν°λ² μ΄μ€ ꡬ쑰 λ° μΏΌλ¦¬ μ±λ₯μ λ―ΈμΉλ μν₯μ΄ μμ΅λλ€. μ΄ κΈμμλ λ κ°μ§ λ°©λ²μ ν¬κ΄μ μΌλ‘ νꡬνλ©°, κ°κ°μ μΈμ μ¬μ©νκ³ μ΄λ»κ² ν¨κ³Όμ μΌλ‘ ꡬνν΄μΌ νλμ§ μλ΄ν©λλ€.
λͺ¨λΈ μμ μ΄ν΄νκΈ°
λͺ¨λΈ μμμ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κΈ°λ³Έ κ°λ μΌλ‘, κΈ°μ‘΄ ν΄λμ€(μ₯κ³ μμλ λͺ¨λΈ)λ₯Ό κΈ°λ°μΌλ‘ μλ‘μ΄ ν΄λμ€λ₯Ό μμ±ν μ μκ² ν΄μ€λλ€. μλ‘μ΄ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μ μμ±κ³Ό λ©μλλ₯Ό μμλ°μ, μ½λλ₯Ό λ€μ μμ±νμ§ μκ³ λ λΆλͺ¨μ λμμ νμ₯νκ±°λ νΉνν μ μμ΅λλ€. μ₯κ³ μμλ λͺ¨λΈ μμμ μ¬μ©νμ¬ μ¬λ¬ λͺ¨λΈμ κ±Έμ³ νλ, λ©μλ, λ©ν μ΅μ μ 곡μ ν©λλ€.
μ¬λ°λ₯Έ μμ μ νμ μ ννλ κ²μ μ ꡬ쑰νλκ³ ν¨μ¨μ μΈ λ°μ΄ν°λ² μ΄μ€λ₯Ό ꡬμΆνλ λ° λ§€μ° μ€μν©λλ€. μμμ μλͺ» μ¬μ©νλ©΄ μ±λ₯ λ¬Έμ μ 볡μ‘ν λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ°λΌμ κ° μ κ·Ό λ°©μμ λ―Έλ¬ν μ°¨μ΄λ₯Ό μ΄ν΄νλ κ²μ΄ νμμ μ λλ€.
μΆμ κΈ°λ³Έ ν΄λμ€
μΆμ κΈ°λ³Έ ν΄λμ€λ?
μΆμ κΈ°λ³Έ ν΄λμ€λ μμλλλ‘ μ€κ³λμμ§λ§ μ§μ μΈμ€ν΄μ€νλμ§λ μλ λͺ¨λΈμ
λλ€. λ€λ₯Έ λͺ¨λΈμ μ²μ¬μ§ μν μ νλ©°, λͺ¨λ μμ λͺ¨λΈμ μ‘΄μ¬ν΄μΌ νλ κ³΅ν΅ νλμ λ©μλλ₯Ό μ μν©λλ€. μ₯κ³ μμλ λͺ¨λΈμ Meta ν΄λμ€μμ abstract μμ±μ Trueλ‘ μ€μ νμ¬ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μ μν©λλ€.
λͺ¨λΈμ΄ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μμλ°μΌλ©΄, μ₯κ³ λ μΆμ κΈ°λ³Έ ν΄λμ€μ μ μλ λͺ¨λ νλμ λ©μλλ₯Ό μμ λͺ¨λΈμ 볡μ¬ν©λλ€. κ·Έλ¬λ μΆμ κΈ°λ³Έ ν΄λμ€ μ체λ λ°μ΄ν°λ² μ΄μ€μ λ³λμ ν μ΄λΈλ‘ μμ±λμ§ μμ΅λλ€. μ΄κ²μ΄ λ€μ€ ν μ΄λΈ μμκ³Όμ μ£Όμ μ°¨μ΄μ μ λλ€.
μΆμ κΈ°λ³Έ ν΄λμ€λ μΈμ μ¬μ©ν΄μΌ ν κΉ?
μΆμ κΈ°λ³Έ ν΄λμ€λ μ¬λ¬ λͺ¨λΈμ κ³΅ν΅ νλλ₯Ό ν¬ν¨μν€κ³ μΆμ§λ§, μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ 쿼리ν νμκ° μμ λ μ΄μμ μ λλ€. μΌλ°μ μΈ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- νμμ€ν¬ν λͺ¨λΈ: μ¬λ¬ λͺ¨λΈμ
created_atλ°updated_atνλ μΆκ°. - μ¬μ©μ κ΄λ ¨ λͺ¨λΈ: νΉμ μ¬μ©μμ μ°κ΄λ λͺ¨λΈμ
userνλ μΆκ°. - λ©νλ°μ΄ν° λͺ¨λΈ: SEO λͺ©μ μ μν΄
title,description,keywordsμ κ°μ νλ μΆκ°.
μΆμ κΈ°λ³Έ ν΄λμ€ μμ
νμμ€ν¬ν λͺ¨λΈμ μν μΆμ κΈ°λ³Έ ν΄λμ€ μμ λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€:
from django.db import models
class TimeStampedModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Article(TimeStampedModel):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title
class Comment(TimeStampedModel):
article = models.ForeignKey(Article, on_delete=models.CASCADE)
text = models.TextField()
def __str__(self):
return self.text
μ΄ μμ μμ TimeStampedModelμ created_atκ³Ό updated_at νλλ₯Ό κ°μ§ μΆμ κΈ°λ³Έ ν΄λμ€μ
λλ€. Articleκ³Ό Comment λͺ¨λΈ λͺ¨λ TimeStampedModelμ μμλ°μ μ΄ νλλ€μ μλμΌλ‘ κ°κ² λ©λλ€. python manage.py migrateλ₯Ό μ€ννλ©΄, μ₯κ³ λ created_atκ³Ό updated_at νλλ₯Ό κ°κ° κ°μ§ Articleκ³Ό Comment λ κ°μ ν
μ΄λΈμ μμ±ν©λλ€. `TimeStampedModel` μ체μ λν ν
μ΄λΈμ μμ±λμ§ μμ΅λλ€.
μΆμ κΈ°λ³Έ ν΄λμ€μ μ₯μ
- μ½λ μ¬μ¬μ©μ±: μ¬λ¬ λͺ¨λΈμ κ±Έμ³ κ³΅ν΅ νλμ λ©μλμ μ€λ³΅μ νΌν©λλ€.
- λ¨μνλ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§: μΆμ κΈ°λ³Έ ν΄λμ€ μμ²΄κ° ν μ΄λΈμ΄ μλλ―λ‘ λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈ μλ₯Ό μ€μ λλ€.
- ν₯μλ μ μ§λ³΄μμ±: μΆμ κΈ°λ³Έ ν΄λμ€μ λ³κ²½ μ¬νμ΄ λͺ¨λ μμ λͺ¨λΈμ μλμΌλ‘ λ°μλ©λλ€.
μΆμ κΈ°λ³Έ ν΄λμ€μ λ¨μ
- μ§μ 쿼리 λΆκ°: μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ 쿼리ν μ μμ΅λλ€. μμ λͺ¨λΈλ§ 쿼리ν μ μμ΅λλ€.
- μ νλ λ€νμ±: λ¨μΌ 쿼리λ₯Ό ν΅ν΄ μΆμ ν΄λμ€μ μ μλ κ³΅ν΅ νλμ μ κ·Όν΄μΌ ν κ²½μ°, λ€λ₯Έ μμ λͺ¨λΈμ μΈμ€ν΄μ€λ₯Ό ν΅μΌμ μΌλ‘ λ€λ£¨κΈ° μ΄λ ΅μ΅λλ€. κ° μμ λͺ¨λΈμ κ°λ³μ μΌλ‘ 쿼리ν΄μΌ ν©λλ€.
λ€μ€ ν μ΄λΈ μμ
λ€μ€ ν μ΄λΈ μμμ΄λ?
λ€μ€ ν μ΄λΈ μμμ μμ κ³μΈ΅μ κ° λͺ¨λΈμ΄ μ체 λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ κ°λ λͺ¨λΈ μμ μ νμ λλ€. λͺ¨λΈμ΄ λ€μ€ ν μ΄λΈ μμμ μ¬μ©νμ¬ λ€λ₯Έ λͺ¨λΈμ μμλ°μΌλ©΄, μ₯κ³ λ μμ λͺ¨λΈκ³Ό λΆλͺ¨ λͺ¨λΈ μ¬μ΄μ μλμΌλ‘ μΌλμΌ κ΄κ³λ₯Ό μμ±ν©λλ€. μ΄λ₯Ό ν΅ν΄ μμ λͺ¨λΈμ λ¨μΌ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ μμ λ° λΆλͺ¨ λͺ¨λΈμ νλμ λͺ¨λ μ κ·Όν μ μμ΅λλ€.
λ€μ€ ν μ΄λΈ μμμ μΈμ μ¬μ©ν΄μΌ ν κΉ?
λ€μ€ ν μ΄λΈ μμμ λ μΌλ°μ μΈ λͺ¨λΈκ³Ό λͺ νν "is-a" κ΄κ³λ₯Ό κ°λ νΉνλ λͺ¨λΈμ λ§λ€κ³ μΆμ λ μ ν©ν©λλ€. μΌλ°μ μΈ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€:
- μ¬μ©μ νλ‘ν: λ€μν μ νμ μ¬μ©μ(μ: κ³ κ°, νλ§€μ, κ΄λ¦¬μ)λ₯Ό μν νΉνλ μ¬μ©μ νλ‘ν μμ±.
- μ ν μ ν: λ€μν μ νμ μ ν(μ: μ± , μ μμ ν, μλ₯)μ μν νΉνλ μ ν λͺ¨λΈ μμ±.
- μ½ν μΈ μ ν: λ€μν μ νμ μ½ν μΈ (μ: κΈ°μ¬, λΈλ‘κ·Έ κ²μλ¬Ό, λ΄μ€ κΈ°μ¬)λ₯Ό μν νΉνλ μ½ν μΈ λͺ¨λΈ μμ±.
λ€μ€ ν μ΄λΈ μμ μμ
μ¬μ©μ νλ‘νμ λν λ€μ€ ν μ΄λΈ μμ μμ λ₯Ό λ§λ€μ΄ λ³΄κ² μ΅λλ€:
from django.db import models
from django.contrib.auth.models import User
class Customer(User):
phone_number = models.CharField(max_length=20, blank=True)
address = models.CharField(max_length=200, blank=True)
def __str__(self):
return self.username
class Vendor(User):
company_name = models.CharField(max_length=100, blank=True)
payment_terms = models.CharField(max_length=100, blank=True)
def __str__(self):
return self.username
μ΄ μμ μμ Customerμ Vendor λͺ¨λΈμ λͺ¨λ λ΄μ₯λ User λͺ¨λΈμ μμν©λλ€. μ₯κ³ λ auth_user(User λͺ¨λΈμ©), customer, vendor μΈ κ°μ ν
μ΄λΈμ μμ±ν©λλ€. customer ν
μ΄λΈμ auth_user ν
μ΄λΈκ³Ό μΌλμΌ κ΄κ³(μμμ μΌλ‘ ForeignKey)λ₯Ό κ°κ² λ©λλ€. λ§μ°¬κ°μ§λ‘, vendor ν
μ΄λΈλ auth_user ν
μ΄λΈκ³Ό μΌλμΌ κ΄κ³λ₯Ό κ°μ΅λλ€. μ΄λ₯Ό ν΅ν΄ Customer λ° Vendor λͺ¨λΈμ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ νμ€ User νλ(μ: username, email, password)μ μ κ·Όν μ μμ΅λλ€.
λ€μ€ ν μ΄λΈ μμμ μ₯μ
- λͺ νν "is-a" κ΄κ³: λͺ¨λΈ κ°μ λͺ νν κ³μΈ΅μ κ΄κ³λ₯Ό λνλ λλ€.
- λ€νμ±: λ€λ₯Έ μμ λͺ¨λΈμ μΈμ€ν΄μ€λ₯Ό λΆλͺ¨ λͺ¨λΈμ μΈμ€ν΄μ€λ‘ μ·¨κΈν μ μμ΅λλ€. λͺ¨λ `User` κ°μ²΄λ₯Ό 쿼리νμ¬
CustomerμVendorμΈμ€ν΄μ€λ₯Ό ν¬ν¨ν κ²°κ³Όλ₯Ό μ»μ μ μμ΅λλ€. - λ°μ΄ν° 무결μ±: μΌλμΌ κ΄κ³λ₯Ό ν΅ν΄ μμ ν μ΄λΈκ³Ό λΆλͺ¨ ν μ΄λΈ κ°μ μ°Έμ‘° 무결μ±μ κ°μ ν©λλ€.
λ€μ€ ν μ΄λΈ μμμ λ¨μ
- λ°μ΄ν°λ² μ΄μ€ 볡μ‘μ± μ¦κ°: λ°μ΄ν°λ² μ΄μ€μ λ λ§μ ν μ΄λΈμ μμ±νμ¬ λ³΅μ‘μ±μ λμ΄κ³ 쿼리 μλλ₯Ό μ νμν¬ μ μμ΅λλ€.
- μ±λ₯ μ€λ²ν€λ: μ¬λ¬ ν μ΄λΈμ κ±ΈμΉ λ°μ΄ν°λ₯Ό 쿼리νλ κ²μ λ¨μΌ ν μ΄λΈμ 쿼리νλ κ²λ³΄λ€ λ ν¨μ¨μ μΌ μ μμ΅λλ€.
- λ°μ΄ν° μ€λ³΅ κ°λ₯μ±: μ£Όμνμ§ μμΌλ©΄ μ¬λ¬ ν μ΄λΈμ λμΌν λ°μ΄ν°λ₯Ό μ μ₯νκ² λ μ μμ΅λλ€.
νλ‘μ λͺ¨λΈ
μΆμ κΈ°λ³Έ ν΄λμ€λ λ€μ€ ν
μ΄λΈ μμκ³Ό κ°μ μ격ν μλ―Έμ λͺ¨λΈ μμ μ νμ μλμ§λ§, νλ‘μ λͺ¨λΈμ μ΄ λ§₯λ½μμ μΈκΈν κ°μΉκ° μμ΅λλ€. νλ‘μ λͺ¨λΈμ μ¬μ©νλ©΄ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ λ³κ²½νμ§ μκ³ λͺ¨λΈμ λμμ μμ ν μ μμ΅λλ€. λͺ¨λΈμ Meta ν΄λμ€μμ proxy = Trueλ‘ μ€μ νμ¬ νλ‘μ λͺ¨λΈμ μ μν©λλ€.
νλ‘μ λͺ¨λΈμ μΈμ μ¬μ©ν΄μΌ ν κΉ?
νλ‘μ λͺ¨λΈμ λ€μκ³Ό κ°μ κ²½μ°μ μ μ©ν©λλ€:
- λͺ¨λΈμ μ¬μ©μ μ μ λ©μλ μΆκ°: λͺ¨λΈμ νλλ κ΄κ³λ₯Ό λ³κ²½νμ§ μκ³ .
- λͺ¨λΈμ κΈ°λ³Έ μ λ ¬ μμ λ³κ²½: νΉμ λ·°λ 컨ν μ€νΈλ₯Ό μν΄.
- λ€λ₯Έ μ₯κ³ μ±μΌλ‘ λͺ¨λΈ κ΄λ¦¬: κΈ°λ³Έ λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈμ μλ μ±μ μ μ§νλ©΄μ.
νλ‘μ λͺ¨λΈ μμ
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.BooleanField(default=False)
def __str__(self):
return self.title
class PublishedArticle(Article):
class Meta:
proxy = True
ordering = ['-title']
def get_absolute_url(self):
return f'/articles/{self.pk}/'
μ΄ μμ μμ PublishedArticleμ Articleμ νλ‘μ λͺ¨λΈμ
λλ€. Articleκ³Ό λμΌν λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ μ¬μ©νμ§λ§, λ€λ₯Έ κΈ°λ³Έ μ λ ¬ μμ(ordering = ['-title'])λ₯Ό κ°μ§κ³ μ¬μ©μ μ μ λ©μλ(get_absolute_url)λ₯Ό μΆκ°ν©λλ€. μλ‘μ΄ ν
μ΄λΈμ μμ±λμ§ μμ΅λλ€.
μ¬λ°λ₯Έ μμ μ ν μ ννκΈ°
λ€μ νλ μΆμ κΈ°λ³Έ ν΄λμ€μ λ€μ€ ν μ΄λΈ μμμ μ£Όμ μ°¨μ΄μ μ μμ½ν©λλ€:
| κΈ°λ₯ | μΆμ κΈ°λ³Έ ν΄λμ€ | λ€μ€ ν μ΄λΈ μμ |
|---|---|---|
| λ°μ΄ν°λ² μ΄μ€ ν μ΄λΈ | λ³λ ν μ΄λΈ μμ | λ³λ ν μ΄λΈ μμ |
| 쿼리 | μ§μ 쿼리 λΆκ° | λΆλͺ¨ λͺ¨λΈμ ν΅ν΄ 쿼리 κ°λ₯ |
| κ΄κ³ | λͺ μμ κ΄κ³ μμ | μΌλμΌ κ΄κ³ |
| μ¬μ© μ¬λ‘ | κ³΅ν΅ νλ λ° λ©μλ 곡μ | "is-a" κ΄κ³λ₯Ό κ°λ νΉνλ λͺ¨λΈ μμ± |
| μ±λ₯ | μΌλ°μ μΌλ‘ λ¨μ μμμ λ λΉ λ¦ | μ‘°μΈ(join)μΌλ‘ μΈν΄ λ λ릴 μ μμ |
μ¬λ°λ₯Έ μμ μ νμ μ ννλ λ° λμμ΄ λλ μμ¬ κ²°μ κ°μ΄λμ λλ€:
- κΈ°λ³Έ ν΄λμ€λ₯Ό μ§μ 쿼리ν΄μΌ ν©λκΉ? κ·Έλ λ€λ©΄ λ€μ€ ν μ΄λΈ μμμ μ¬μ©νμΈμ. κ·Έλ μ§ μλ€λ©΄ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό κ³ λ €νμΈμ.
- λͺ νν "is-a" κ΄κ³λ₯Ό κ°λ νΉνλ λͺ¨λΈμ λ§λ€κ³ μμ΅λκΉ? κ·Έλ λ€λ©΄ λ€μ€ ν μ΄λΈ μμμ μ¬μ©νμΈμ.
- μ£Όλ‘ κ³΅ν΅ νλμ λ©μλλ₯Ό 곡μ ν΄μΌ ν©λκΉ? κ·Έλ λ€λ©΄ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μ¬μ©νμΈμ.
- λ°μ΄ν°λ² μ΄μ€ 볡μ‘μ±κ³Ό μ±λ₯ μ€λ²ν€λκ° μ°λ €λ©λκΉ? κ·Έλ λ€λ©΄ μΆμ κΈ°λ³Έ ν΄λμ€λ₯Ό μ νΈνμΈμ.
λͺ¨λΈ μμμ μν λͺ¨λ² μ¬λ‘
μ₯κ³ μμ λͺ¨λΈ μμμ μ¬μ©ν λ λ°λΌμΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€:
- μμ κ³μΈ΅μ μκ² μ μ§νμΈμ: κΉμ μμ κ³μΈ΅μ μ΄ν΄νκ³ μ μ§νκΈ° μ΄λ €μμ§ μ μμ΅λλ€. μμ κ³μΈ΅μ μμ€μ μ ννμΈμ.
- μλ―Έ μλ μ΄λ¦μ μ¬μ©νμΈμ: λͺ¨λΈκ³Ό νλμ μ€λͺ μ μΈ μ΄λ¦μ μ ννμ¬ μ½λ κ°λ μ±μ λμ΄μΈμ.
- λͺ¨λΈμ λ¬ΈμννμΈμ: λͺ¨λΈμ λͺ©μ κ³Ό λμμ μ€λͺ νκΈ° μν΄ λ μ€νΈλ§(docstring)μ μΆκ°νμΈμ.
- λͺ¨λΈμ μ² μ ν ν μ€νΈνμΈμ: λͺ¨λΈμ΄ μμλλ‘ μλνλμ§ νμΈνκΈ° μν΄ λ¨μ ν μ€νΈλ₯Ό μμ±νμΈμ.
- λ―Ήμ€μΈ(Mixin) μ¬μ©μ κ³ λ €νμΈμ: λ―Ήμ€μΈμ μ¬λ¬ λͺ¨λΈμ μΆκ°ν μ μλ μ¬μ¬μ© κ°λ₯ν κΈ°λ₯μ μ 곡νλ ν΄λμ€μ
λλ€. κ²½μ°μ λ°λΌ μμμ μ’μ λμμ΄ λ μ μμ΅λλ€. λ―Ήμ€μΈμ λ€λ₯Έ ν΄λμ€μ μν΄ μμλ κΈ°λ₯μ μ 곡νλ ν΄λμ€μ
λλ€. μ΄κ²μ κΈ°λ³Έ ν΄λμ€κ° μλλΌ νΉμ λμμ μ 곡νλ λͺ¨λμ
λλ€. μλ₯Ό λ€μ΄, λͺ¨λΈμ λν λ³κ²½ μ¬νμ μλμΌλ‘ κΈ°λ‘νλ
LoggableMixinμ λ§λ€ μ μμ΅λλ€. - λ°μ΄ν°λ² μ΄μ€ μ±λ₯μ μ μνμΈμ: Django Debug Toolbarμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μΏΌλ¦¬ μ±λ₯μ λΆμνκ³ μ μ¬μ μΈ λ³λͺ© νμμ μλ³νμΈμ.
- λ°μ΄ν°λ² μ΄μ€ μ κ·νλ₯Ό κ³ λ €νμΈμ: μ¬λ¬ κ³³μ λμΌν λ°μ΄ν°λ₯Ό μ μ₯νμ§ λ§μΈμ. λ°μ΄ν°λ² μ΄μ€ μ κ·νλ λ°μ΄ν°λ² μ΄μ€ λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ΄ μ’ μμ±μ μ¬λ°λ₯΄κ² κ°μ νλλ‘ ν μ΄λΈμ λ°μ΄ν°λ₯Ό ꡬμ±νμ¬ μ€λ³΅μ±μ μ€μ΄κ³ λ°μ΄ν° 무결μ±μ ν₯μμν€λ λ° μ¬μ©λλ κΈ°μ μ λλ€.
μ μΈκ³μ μ€μ©μ μΈ μμ
λ€μν μ ν리μΌμ΄μ μμ λͺ¨λΈ μμμ μ¬μ©νλ λ°©λ²μ 보μ¬μ£Όλ λͺ κ°μ§ μ μΈκ³μ μΈ μμ μ λλ€:
- μ μμκ±°λ νλ«νΌ (μ μΈκ³):
- λ€μ€ ν μ΄λΈ μμμ λ€μν μ νμ μ ν(μ: μ€λ¬Ό μ ν, λμ§νΈ μ ν, μλΉμ€)μ λͺ¨λΈλ§νλ λ° μ¬μ©ν μ μμ΅λλ€. κ° μ ν μ νμ κΈ°λ³Έ μ ν λͺ¨λΈμμ μ΄λ¦, μ€λͺ , κ°κ²©κ³Ό κ°μ κ³΅ν΅ μμ±μ μμλ°μΌλ©΄μ κ³ μ ν μμ±μ κ°μ§ μ μμ΅λλ€. μ΄λ κ·μ μ΄λ λ¬Όλ₯λ‘ μΈν μ ν λ³νμ΄ λ³κ°μ λͺ¨λΈμ μꡬνλ κ΅μ μ μμκ±°λμμ νΉν μ μ©ν©λλ€.
- μΆμ κΈ°λ³Έ ν΄λμ€λ λͺ¨λ μ€λ¬Ό μ νμ 'λ°°μ‘ λ¬΄κ²' λ° 'μΉμ'μ κ°μ κ³΅ν΅ νλλ₯Ό μΆκ°νκ±°λ λͺ¨λ λμ§νΈ μ νμ 'λ€μ΄λ‘λ λ§ν¬' λ° 'νμΌ ν¬κΈ°'μ κ°μ νλλ₯Ό μΆκ°νλ λ° μ¬μ©ν μ μμ΅λλ€.
- λΆλμ° κ΄λ¦¬ μμ€ν
(κ΅μ ):
- λ€μ€ ν μ΄λΈ μμμ λ€μν μ νμ λΆλμ°(μ: μ£Όκ±°μ© λΆλμ°, μμ μ© λΆλμ°, ν μ§)μ λͺ¨λΈλ§ν μ μμ΅λλ€. κ° μ νμ μ£Όκ±°μ© λΆλμ°μ 'μΉ¨μ€ μ'λ μμ μ© λΆλμ°μ 'μ©μ λ₯ 'κ³Ό κ°μ κ³ μ ν νλλ₯Ό κ°μ§ μ μμΌλ©°, κΈ°λ³Έ λΆλμ° λͺ¨λΈμμ 'μ£Όμ' λ° 'κ°κ²©'κ³Ό κ°μ κ³΅ν΅ νλλ₯Ό μμλ°μ΅λλ€.
- μΆμ κΈ°λ³Έ ν΄λμ€λ λΆλμ° κ°μ©μ±μ μΆμ νκΈ° μν΄ 'λ§€λ¬Ό λ±λ‘μΌ' λ° 'μ μ£Ό κ°λ₯μΌ'κ³Ό κ°μ κ³΅ν΅ νλλ₯Ό μΆκ°ν μ μμ΅λλ€.
- κ΅μ‘ νλ«νΌ (μ μΈκ³):
- λ€μ€ ν μ΄λΈ μμμ λ€μν μ νμ κ³Όμ (μ: μ¨λΌμΈ κ³Όμ , λλ©΄ κ³Όμ , μν¬μ)μ λνλΌ μ μμ΅λλ€. μ¨λΌμΈ κ³Όμ μ 'λΉλμ€ URL' λ° 'κΈ°κ°'κ³Ό κ°μ μμ±μ κ°μ§ μ μκ³ , λλ©΄ κ³Όμ μ 'μ₯μ' λ° 'μΌμ 'κ³Ό κ°μ μμ±μ κ°μ§ μ μμΌλ©°, κΈ°λ³Έ κ³Όμ λͺ¨λΈμμ 'μ λͺ©' λ° 'μ€λͺ 'κ³Ό κ°μ κ³΅ν΅ μμ±μ μμλ°μ΅λλ€. μ΄λ λ€μν μ 곡 λ°©λ²μ μ 곡νλ μ μΈκ³μ λ€μν κ΅μ‘ μμ€ν μμ μ μ©ν©λλ€.
- μΆμ κΈ°λ³Έ ν΄λμ€λ λͺ¨λ κ³Όμ μ κ±Έμ³ μΌκ΄μ±μ 보μ₯νκΈ° μν΄ 'λμ΄λ' λ° 'μΈμ΄'μ κ°μ κ³΅ν΅ νλλ₯Ό μΆκ°ν μ μμ΅λλ€.
κ²°λ‘
μ₯κ³ λͺ¨λΈ μμμ μ ꡬ쑰νλκ³ μ μ§λ³΄μ κ°λ₯ν λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§λ₯Ό ꡬμΆνκΈ° μν κ°λ ₯ν λꡬμ λλ€. μΆμ κΈ°λ³Έ ν΄λμ€μ λ€μ€ ν μ΄λΈ μμμ μ°¨μ΄μ μ μ΄ν΄ν¨μΌλ‘μ¨, νΉμ μ¬μ© μ¬λ‘μ λ§λ μ¬λ°λ₯Έ μ κ·Ό λ°©μμ μ νν μ μμ΅λλ€. κ²°μ μ λ΄λ¦΄ λ μ½λ μ¬μ¬μ©μ±, λ°μ΄ν°λ² μ΄μ€ 볡μ‘μ±, μ±λ₯ μ€λ²ν€λ κ°μ κ· νμ κ³ λ €νλ κ²μ μμ§ λ§μΈμ. μ΄ κΈμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ ν¨μ¨μ μ΄κ³ νμ₯ κ°λ₯ν μ₯κ³ μ ν리μΌμ΄μ μ λ§λλ λ° λμμ΄ λ κ²μ λλ€.